/**
 * 权限管理下的角色管理模块
 */
const db = require('../db/index')
const { Op } = require("sequelize")
const crypto = require('crypto')

//引入角色模型
const initModels = require('../models/init-models')
const Role = initModels(db).info_roles
const moment = require('moment');

//获取所有角色
exports.getAllRoles = async (req,res) => {
    try{
        await db.sync()
        const result = await Role.findAll({
            attributes: ['id','roleName'],
            order: [
                ['createTime','DESC']
            ]
        })
        res.dataSend('查询成功！',0,result)
    }catch (error){
        res.cc(error)
    }
}
//获取角色信息的函数
exports.roleInfo = async (req,res) => {
    //获取传入的参数
    const { roleName, page, limit } = req.query
    try{
        await db.sync()
        let { count, rows } = await Role.findAndCountAll({
            attributes: ['id', 'createTime', 'updateTime', 'roleName', 'menuId'],
            //如果有查询条件则加入查询条件，如果没有则查询全部数据
            where: roleName !== undefined && roleName !== '' ? {
                roleName: { [Op.substring]: roleName }
            } : undefined,
            offset: (page - 1)*limit,
            limit: limit*1,
            order: [
                ['createTime','DESC']
            ]
        })
        res.pageSend('查询成功！',0,rows,count,limit,page)
    }catch (error){
        res.cc(error)
    }
}
//添加角色
exports.addRole = async (req,res) => {
    //接收表单数据
    const { roleName } = req.body
    try{
        await db.sync()
        //sql语句查询角色名是否被占用
        let result = await Role.findAll({
            where: { roleName },
        })
        if(result.length >= 1) return res.cc('角色名被占用，请更换其他角色名！')
        //生成id
        const id = crypto.randomUUID()
        //生成时间
        const createTime = moment().format('YYYY-MM-DD HH:mm:ss')
        const updateTime = moment().format('YYYY-MM-DD HH:mm:ss')
        let addResult = await Role.create({
            id,
            createTime,
            updateTime,
            roleName
        })
        if(addResult === null){
            return res.cc('添加角色失败，请稍后再试！')
        }
        res.cc('添加成功！',0)
    } catch (error) {
        res.cc(error)
    }
}
//修改角色
exports.updateRole = async (req,res) => {
    //接收表单数据
    const { id, roleName } = req.body
    try{
        await db.sync()
        //sql语句查询角色名是否被占用
        let result = await Role.findAll({
            where: {
                roleName: roleName,
                id: {
                    // [Op.ne]表示不等于
                    [Op.ne]: id
                }
            },
        })
        if(result.length >= 1) return res.cc('角色名被占用，请更换其他角色名！')
        //更新时间
        const updateTime = moment().format('YYYY-MM-DD HH:mm:ss')
        let addResult = await Role.update({
            roleName,
            updateTime}, {
            where: {
                id: id
            }
        })
        if(addResult === null){
            return res.cc('修改角色失败，请稍后再试！')
        }
        res.cc('修改成功！',0)
    } catch (error) {
        res.cc(error)
    }
}
//获取当前角色已有的权限
exports.getRoleMenu = async (req,res) => {
    const id = req.query.id
    try{
        await db.sync()
        const result = await Role.findOne({
            attributes: ['menuId'],
            where: {id}
        })
        res.dataSend('查询成功！',0,result)
    }catch (error){
        res.cc(error)
    }
}
//给角色分配权限
exports.updateRoleMenu = async (req,res) => {
    const { id, menuId } = req.body
    try {
        await db.sync()
        //更新时间
        const updateTime = moment().format('YYYY-MM-DD HH:mm:ss')
        const result = await Role.update({ menuId, updateTime },{
            where: {
                id: id
            }
        })
        if(result === null){
            return res.cc('分配角色失败，请稍后再试！')
        }
        res.cc('分配成功！',0)
    }catch (error){
        res.cc(error)
    }
}
//删除角色
exports.deleteRole = async (req,res) => {
    const ids = req.body
    try {
        await db.sync()
        const result = await Role.destroy({
            where:{
                id: {
                    [Op.in]: ids
                }
            }
        })
        if(result === null){
            return res.cc('删除角色失败，请稍后再试！')
        }
        res.cc('删除成功！',0)
    }catch (error){
        res.cc(error)
    }
}
